#ifndef PAGECALCULATIONSERVICE_H
#define PAGECALCULATIONSERVICE_H

#include <QObject>
#include <QMap>
#include <QString>
#include "unifiedfileinfo.h"
#include "layoutstatemanager.h"

/**
 * @brief 页码计算服务 - Martin Fowler重构：单一职责原则
 *
 * 专门负责：
 * - 文件显示页数计算
 * - 全局页码映射计算
 * - 页码连续性保证
 *
 * 设计原则：
 * - Single Responsibility: 只负责页码计算逻辑
 * - Stateless Service: 无状态服务，便于测试
 * - Dependency Inversion: 依赖抽象而非具体实现
 */
class PageCalculationService : public QObject
{
    Q_OBJECT

public:
    explicit PageCalculationService(QObject* parent = nullptr);
    ~PageCalculationService() = default;

    // === 显示页数计算 ===

    /**
     * @brief 计算单个文件的显示页数
     * @param fileInfo 文件信息
     * @return 显示页数
     */
    int calculateDisplayPages(const UnifiedFileInfo& fileInfo) const;

    /**
     * @brief 批量计算文件的显示页数
     * @param files 文件列表
     * @return 文件标识 -> 显示页数的映射
     */
    QMap<QString, int> calculateDisplayPages(const QList<UnifiedFileInfo>& files) const;

    // === 全局页码映射计算 ===

    /**
     * @brief 计算全局页码映射
     * @param orderedFiles 按顺序排列的文件列表
     * @return 文件标识 -> 起始页码的映射
     */
    QMap<QString, int> calculateGlobalPageMapping(const QList<UnifiedFileInfo>& orderedFiles) const;

    /**
     * @brief 计算文件的全局页码范围
     * @param fileInfo 文件信息
     * @param filesInOrder 所有按顺序排列的文件
     * @return QPair<起始页码, 结束页码>
     */
    QPair<int, int> calculateFileGlobalRange(const UnifiedFileInfo& fileInfo,
                                           const QList<UnifiedFileInfo>& filesInOrder) const;

    // === 页码转换 ===

    /**
     * @brief 本地页码转换为全局页码
     * @param fileIdentity 文件唯一标识
     * @param localPage 本地页码（0-based）
     * @param globalMapping 全局页码映射
     * @return 全局页码（1-based），转换失败返回0
     */
    int convertToGlobalPage(const QString& fileIdentity, int localPage,
                           const QMap<QString, int>& globalMapping) const;

    /**
     * @brief 全局页码转换为本地页码
     * @param globalPage 全局页码（1-based）
     * @param fileIdentity 文件唯一标识
     * @param filesInOrder 所有按顺序排列的文件
     * @return 本地页码（0-based），转换失败返回-1
     */
    int convertToLocalPage(int globalPage, const QString& fileIdentity,
                          const QList<UnifiedFileInfo>& filesInOrder) const;

    // === 验证和调试 ===

    /**
     * @brief 验证页码映射的一致性
     * @param filesInOrder 按顺序排列的文件列表
     * @param globalMapping 全局页码映射
     * @return 验证结果和错误信息
     */
    QPair<bool, QString> validatePageMapping(const QList<UnifiedFileInfo>& filesInOrder,
                                           const QMap<QString, int>& globalMapping) const;

    /**
     * @brief 生成页码映射的调试信息
     * @param filesInOrder 按顺序排列的文件列表
     * @param globalMapping 全局页码映射
     * @return 调试信息字符串
     */
    QString generateDebugInfo(const QList<UnifiedFileInfo>& filesInOrder,
                             const QMap<QString, int>& globalMapping) const;

private:
    /**
     * @brief 计算基础页数
     * @param fileInfo 文件信息
     * @return 基础页数
     */
    int calculateBasePageCount(const UnifiedFileInfo& fileInfo) const;

    /**
     * @brief 获取布局模式
     * @param fileInfo 文件信息
     * @return 布局模式
     */
    LayoutMode getLayoutMode(const UnifiedFileInfo& fileInfo) const;
};

#endif // PAGECALCULATIONSERVICE_H